机器学习预测乳腺肿瘤性质(4)——神经网络
作者:汪君,专职数据分析,Python和R爱好者
个人微信公众号:学英文和玩数据
前文传送门:
今天我们利用multiple layer perceptron (MLP)这种机器学习算法来分析乳腺肿瘤数据,MLP中文翻译为多层感知器, 是一种比较基础简单的人工神经网络(artificial neural network)算法。现在深度学习中最热门的卷积神经网络CNN(convolutional neural network)和循环神经网络RNN(recurrent neural network)都是以MLP为基础构建起来的,学习MLP可以帮助我们理解人工神经网络的基本知识和基础架构,为后面CNN和RNN的学习铺平道路。
首先我们来看看人工神经网络的基本结构:
简述一下神经网络的机制:把输入层的特征变量先乘以权重后求和加上一个偏置项,通过一个activation function 进行非线性转换,将这些非线性变换的结果再次作为输入层,以同样的方法再次进入下一个隐藏层,直到最后的输出层,该过程称为前向传播(forward propagation),再利用后向传播算法(back propagation)和梯度下降更新权重,不断最小化损失函数,直至得到最优解(或者局部最优解)。
神经网络结构的隐藏层部分可以自由搭建,就像乐高积木一样可以一层一层拼接起来,隐藏层可以10层,可以20层,甚至上百层上千层,只要算力足够,现在深度学习的发展趋势是网络层数越来越多,所以得名Deep Learning。每一个隐藏层的神经元个数也可自由设置,可以说神经网络的构建没有严格意义上的规则可循,但是网络结构常常决定最后的算法效果。CNN和RNN正是通过对基础神经网络架构的各项要素(各层输入变量、隐藏层的维度、非线性转换方式等方面)进行改造完善,近年来在图像识别、语音识别、自然语言等领域表现出令人惊叹的效果,证明了神经网络这种层级网络结构在捕捉数据背后隐藏规律方面的巨大威力。
在应用方面,MLP算法有一下优势:
1 能够构建非线性的模型
2 能够实现实时学习
当然也有其不足之处
1 损失函数非凸,局部最优解可能不止一个,所以初始权重如果随机设置的话,常常会导致交叉验证时得到的准确率数据无法对比。
2 存在相当数量的超参数需要进行调参
3 对特征缩放(feature scaling)敏感
Python的scikit-learn Module提供了专门的函数构建MLP的分类器,即MLPclassifier
MLPClassifier 函数中的各项参数设置:
hidden_layer_sizes
隐藏层层数和每层神经元个数设置,默认值为(100,),设置为(5,3)表示有两层隐藏层,一个隐藏层有5个神经元,第二个隐藏层3个神经元。
activation
有四种激活函数可以选择{‘identity’, ‘logistic’, ‘tanh’, ‘relu’},,默认是relu激活函数,一般都使用relu ,四种激活函数的形式如下:
‘identity’, 45 33458 45 15231 0 0 4240 0 0:00:07 0:00:03 0:00:04 4240f(x) = x
‘logistic’, f(x) = 1 / (1 + exp(-x)).
‘tanh’, f(x) = tanh(x).
‘relu’, f(x) = max(0, x)
solver
solver是通过不断寻找损失函数最优解来进行权重迭代更新的优化器,有三种可以选择 {‘lbfgs’, ‘sgd’, ‘adam’},默认设置是“adam”,‘lbfgs’ 是拟牛顿法的一种,.‘sgd’ 是随机梯度下降法,‘adam’ 是基于随机梯度下降的另一种优化算法,adam在大规模训练集上表现优秀(相对来说能够节省训练时间和提高validation score),lbfgs在小规模训练集上效果更好,收敛更快。
alpha
正则化参数. alpha是进行L2惩罚项的参数。默认值为0.0001。
batch_size
批尺寸,一般对随机优化方法都需要批尺寸这个参数,默认为min(200, n_samples),即200和训练集样本量两者之间的最小值,当然如果solver选择了lbfgs的话,就没有必要使用批尺寸了。
learning_rate
中文翻译为学习率,各种教程里面经常用
‘adaptive’会依据损失函数的值来调整学习率,只要训练时的损失函数值一直下降,学习率不变。但是如果连续两次迭代都没有降低损失函数一个tol的值,或者将validation score提高一个tol,在early_stopping参数为on的情况下,当前的学习率会除以五,‘adaptive’只在solver选择sgd的时候有效。
learning_rate_init
学习率初始值设置为0.001,该设置只有在solver为sgd或者adam时候才有效。
power_t
设置指数,用来控制学习率降低的速度,学习率那里如果选择了 ‘invscaling’时可以设置这个参数,该参数只对sgd有效。
max_iter
最大迭代次数,默认值是200,对于随机优化器来说(sgd和adam), 如果迭代过程中出现了tol定义的收敛或者是到达最大迭代次数,训练就会停止。注意这个参数控制的是epoch,而不是steps。关于epoch和steps的区别,在stackoverflow上面有很好的解释,链接点这里:https://stackoverflow.com/questions/4752626/epoch-vs-iteration-when-training-neural-networks
shuffle
每次迭代之前是否先对数据随机排列下顺序(洗牌),只对随机优化器有效,默认值为True.
random_state
是否设置随机种子,默认值为None。
tol
优化阈值,默认值为0.0001,连续两次迭代如果损失函数的值没有降低一个tol或者分数没有提高一个tol,就认为已经收敛,训练进程就会停止,除非学习率设置为adaptive。
verbose
默认值为False,是否打印迭代的输出。
warm_start
默认值是False,如果设置为True,就重复利用上次fit的结果作为初始值,这样可以提高神经网络训练结果的利用率。
early_stopping
该参数的作用是当validation score没有改善时,是否要终止训练。如果把early_stopping设置为True,神经网络在训练的时候会自动拿出10%的训练数据出来作为validation数据集,如果连续两次迭代validation score都没有提高一个tol,训练过程就会中止。该参数只有在使用随机优化器(sgd,adam)的时候有效。默认值为False。
validation_fraction
validation比例,如果前面的early_stopping设置为True,这个参数取值为0到1之间,设置拿出多少比例的训练集数据做validation,默认值为0.1。
momentum ,nesterovs_momentum ,beta_1 ,beta_2 ,epsilon 这些变量都是控制梯度下降的幅度或方向的参数,尤其是使用adam这个优化器时。一般可采取默认值,如果想了解这几个参数的具体含义,可以参考Hands-On Machine Learning with Scikit Learn and TensorFlow 这本书的第十一章。
from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import cross_val_score
clf=MLPClassifier(activation="relu",batch_size=80,hidden_layer_sizes=(30,30,30,15,55,15,15,30),max_iter=2000,random_state=42,learning_rate_init=0.001)
cross_val_score(cv=5,estimator=clf,n_jobs=-1,X=predi_features,y=diagnosis,scoring="accuracy")
结果
出于展示的效果,我们这里只是随手设置了几个隐藏层和每层神经元个数,结果提示MLP的分类效果也不错,做完捂着轿车验证,预测乳腺肿瘤性质的准确率大概在90%左右。
参考资料:
http://scikit-learn.org/dev/modules/neural_networks_supervised.html
http://scikit-learn.org/dev/modules/generated/sklearn.neural_network.MLPClassifier.html
如果我的笔记对您有帮助,请帮我点赞
获取本文数据:下图扫码关注Python爱好者公众号,后台回复 data
Python爱好者社区历史文章大合集:
Python爱好者社区历史文章列表(每周append更新一次)
关注后在公众号内回复“课程”即可获取:
0.小编的Python入门视频课程!!!
1.崔老师爬虫实战案例免费学习视频。
2.丘老师数据科学入门指导免费学习视频。
3.陈老师数据分析报告制作免费学习视频。
4.玩转大数据分析!Spark2.X+Python 精华实战课程免费学习视频。
5.丘老师Python网络爬虫实战免费学习视频。